// Copyright 2024 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
//
// AUTOGENERATED FILE, DO NOT EDIT
//
// To regenerate, run `go run gen/hpack_gen.go > hpack.autogen.inc`.
// This file should be included in exactly one *.cc file.
//

// clang-format off

// Huffman decoder table. Decoding starts at index=0. For each bit, we inspect
// kHuffmanDecoderTable[index][bit] and take an action based on that value:
//
//   * If the value matches 0b0..._...., set index=value
//   * If the value matches 0b1xxx_xxxx, output byte 32 + xx_xxxx, set index=0
//   * If the value matches 0b1111_1110, fail: unprintable character
//   * If the value matches 0b1111_1111, fail: decoder entered an invalid state
//
static constexpr std::array<uint8_t[2], 114> kHuffmanDecoderTable = {{
  /*0=*/ {1, 22},
  /*1=*/ {2, 9},
  /*2=*/ {3, 6},
  /*3=*/ {4, 5},
  /*4=*/ {144, 145},
  /*5=*/ {146, 193},
  /*6=*/ {7, 8},
  /*7=*/ {195, 197},
  /*8=*/ {201, 207},
  /*9=*/ {10, 15},
  /*10=*/ {11, 12},
  /*11=*/ {211, 212},
  /*12=*/ {13, 14},
  /*13=*/ {128, 133},
  /*14=*/ {141, 142},
  /*15=*/ {16, 19},
  /*16=*/ {17, 18},
  /*17=*/ {143, 147},
  /*18=*/ {148, 149},
  /*19=*/ {20, 21},
  /*20=*/ {150, 151},
  /*21=*/ {152, 153},
  /*22=*/ {23, 40},
  /*23=*/ {24, 31},
  /*24=*/ {25, 28},
  /*25=*/ {26, 27},
  /*26=*/ {157, 161},
  /*27=*/ {191, 194},
  /*28=*/ {29, 30},
  /*29=*/ {196, 198},
  /*30=*/ {199, 200},
  /*31=*/ {32, 35},
  /*32=*/ {33, 34},
  /*33=*/ {204, 205},
  /*34=*/ {206, 208},
  /*35=*/ {36, 37},
  /*36=*/ {210, 213},
  /*37=*/ {38, 39},
  /*38=*/ {154, 162},
  /*39=*/ {163, 164},
  /*40=*/ {41, 56},
  /*41=*/ {42, 49},
  /*42=*/ {43, 46},
  /*43=*/ {44, 45},
  /*44=*/ {165, 166},
  /*45=*/ {167, 168},
  /*46=*/ {47, 48},
  /*47=*/ {169, 170},
  /*48=*/ {171, 172},
  /*49=*/ {50, 53},
  /*50=*/ {51, 52},
  /*51=*/ {173, 174},
  /*52=*/ {175, 176},
  /*53=*/ {54, 55},
  /*54=*/ {177, 178},
  /*55=*/ {179, 180},
  /*56=*/ {57, 64},
  /*57=*/ {58, 61},
  /*58=*/ {59, 60},
  /*59=*/ {181, 182},
  /*60=*/ {183, 185},
  /*61=*/ {62, 63},
  /*62=*/ {202, 203},
  /*63=*/ {209, 214},
  /*64=*/ {65, 68},
  /*65=*/ {66, 67},
  /*66=*/ {215, 216},
  /*67=*/ {217, 218},
  /*68=*/ {69, 72},
  /*69=*/ {70, 71},
  /*70=*/ {134, 138},
  /*71=*/ {140, 155},
  /*72=*/ {73, 74},
  /*73=*/ {184, 186},
  /*74=*/ {75, 78},
  /*75=*/ {76, 77},
  /*76=*/ {129, 130},
  /*77=*/ {136, 137},
  /*78=*/ {79, 81},
  /*79=*/ {159, 80},
  /*80=*/ {135, 139},
  /*81=*/ {82, 84},
  /*82=*/ {220, 83},
  /*83=*/ {131, 158},
  /*84=*/ {85, 88},
  /*85=*/ {86, 87},
  /*86=*/ {254, 132},
  /*87=*/ {160, 187},
  /*88=*/ {89, 90},
  /*89=*/ {189, 222},
  /*90=*/ {91, 92},
  /*91=*/ {190, 221},
  /*92=*/ {93, 94},
  /*93=*/ {156, 192},
  /*94=*/ {219, 95},
  /*95=*/ {96, 99},
  /*96=*/ {97, 254},
  /*97=*/ {98, 254},
  /*98=*/ {188, 254},
  /*99=*/ {254, 100},
  /*100=*/ {254, 101},
  /*101=*/ {254, 102},
  /*102=*/ {254, 103},
  /*103=*/ {254, 104},
  /*104=*/ {254, 105},
  /*105=*/ {254, 106},
  /*106=*/ {254, 107},
  /*107=*/ {254, 108},
  /*108=*/ {254, 109},
  /*109=*/ {110, 111},
  /*110=*/ {223, 254},
  /*111=*/ {254, 112},
  /*112=*/ {254, 113},
  /*113=*/ {254, 255},

}};

// Decoder table stats:
//   before optimization = {numBranchNodes:256 numOutputNodes:96 numUnprintableNodes:160 numInvalidNodes:1}
//   after  optimization = {numBranchNodes:114 numOutputNodes:96 numUnprintableNodes:18 numInvalidNodes:1}


// HPACK-encoded header fields which form grpc Response-Headers.
// These are the same for every response.
static constexpr std::array<uint8_t, 19> kResponseHeaderFields = {
  0x88, 0x5f, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x67, 0x72, 0x70, 0x63
};

// HPACK-encoded header fields which form grpc Trailers. All response Trailers
// are identical except for the status code.
//
// This is indexed by pw::Status::Code, which happens to be identical to grpc's
// status code.
struct ResponseTrailerPayload {
  uint32_t size;
  std::array<uint8_t, 16> bytes;
};
static constexpr std::array<ResponseTrailerPayload, 17> kResponseTrailerFields = {{
  {.size=15, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1, 0x30}},
  {.size=15, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1, 0x31}},
  {.size=15, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1, 0x32}},
  {.size=15, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1, 0x33}},
  {.size=15, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1, 0x34}},
  {.size=15, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1, 0x35}},
  {.size=15, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1, 0x36}},
  {.size=15, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1, 0x37}},
  {.size=15, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1, 0x38}},
  {.size=15, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1, 0x39}},
  {.size=16, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2, 0x31, 0x30}},
  {.size=16, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2, 0x31, 0x31}},
  {.size=16, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2, 0x31, 0x32}},
  {.size=16, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2, 0x31, 0x33}},
  {.size=16, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2, 0x31, 0x34}},
  {.size=16, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2, 0x31, 0x35}},
  {.size=16, .bytes={0x40, 0xb, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2, 0x31, 0x36}},

}};
